using System;
using System.Collections.Generic;
using Csla;
using Ent.AccesoDatos;
using System.Data;
using EntGuayasSLA.BL.Listas.Criterias;

namespace EntGuayasSLA.BL.Listas
{
    /// <summary>
    /// Estereotipo: ReadOnlyList
    /// Reponsabilidad: 
    /// Autor: Luis Cuenca
    /// Fecha: 8/9/2013 9:30:36 AM
    /// </summary>
    [Serializable]
    public class FuncionalidadLista : ReadOnlyListBase<FuncionalidadLista, FuncionalidadInfo>
    {
        #region Authorization Rules

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowGet(typeof(FuncionalidadLista), "Role");
        }

        #endregion

        #region Factory Methods

        public static FuncionalidadLista GetFuncionalidadLista(string usuario,string rol)
        {
            var criterio = FuncionalidadCriteria.NewUsuarioCriteria();
            criterio.UsuarioId = usuario;
            criterio.RolId = rol;
            return DataPortal.Fetch<FuncionalidadLista>(criterio);
        }
        private FuncionalidadLista()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void DataPortal_Fetch(FuncionalidadCriteria criteria)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> 
            {
                new Parametro("ec_rol_id", criteria.RolId),
                new Parametro("et_usr_id", criteria.UsuarioId)
            };
            DataSet datos = accesoDatos.EjecutarDataSet("\"LISTA_USER_ACCESOS\"", parametros);
            foreach (DataRow items in datos.Tables[0].Rows)
            {
                this.Add(FuncionalidadInfo.GetFuncionalidadInfo(items));
            }
            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }
        #endregion
    }
    /// <summary>
    /// Estereotipo: ReadOnlyChild
    /// Reponsabilidad: 
    /// Autor: USUARIO
    /// Fecha: 8/9/2013 9:30:36 AM
    /// </summary>
    [Serializable]
    public class FuncionalidadInfo : ReadOnlyBase<FuncionalidadInfo>
    {
        #region Business Methods

        public string Id { get; internal set; }
        public string MenuId { get; internal set; }
        public string ItemMenuId { get; internal set; }
        public string CodigoMenu { get; internal set; }
        public string NombreMenu { get; internal set; }
        public string CodigoItemMenu { get; internal set; }
        public string NombreItemMenu { get; internal set; }
        public string Url { get; internal set; }
        public int OrdenItem { get; internal set; }
        public int OrdenMenu { get; internal set; }

        #endregion

        #region Factory Methods

        internal static FuncionalidadInfo GetFuncionalidadInfo(DataRow childData)
        {
            return DataPortal.FetchChild<FuncionalidadInfo>(childData);
        }

        private FuncionalidadInfo()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void Child_Fetch(DataRow childData)
        {
            Id=childData["fua_id"].ToString();
            MenuId = childData["men_id"].ToString();
            ItemMenuId = childData["ime_id"].ToString();
            CodigoItemMenu = childData["ime_codigo"].ToString();
            NombreItemMenu = childData["ime_nombre"].ToString();
            Url = childData["ime_url"].ToString();
            CodigoMenu = childData["men_codigo"].ToString();
            NombreMenu = childData["men_nombre"].ToString();
            OrdenItem = int.Parse(childData["ime_orden"].ToString());
            OrdenMenu = int.Parse(childData["men_orden"].ToString());
        }

        #endregion
    }
}
